package com.tinfeng.oop;

public class JavaPackage {
    /**
     * 封装的优点：
     * 封装有利于提高类的内聚性，适当的封装可以让代码更容易理解与维护；
     * 良好的封装有利于降低代码的耦合度；
     * 一些关键属性只允许类内部可以访问和修改，增强类的安全性；
     * 隐藏实现细节，为调用方提供易于理解的接口；
     * 当需求发生变动时，我们只需要修改我们封装的代码，而不需要到处修改调用处的代码。
     */
    // private 关键字限定了其修饰的成员只能在类内部访问，这样之后就无法在类外部使用
    // 封装方法，把变量用private 修饰后 就不能在外部直接访问了 需要实现公开的getter和setter 来供外部修改内部的值

     private String name;
     private int age;

    // 无参构造方法
    public JavaPackage() {

    }

    // 单参构造方法
    public JavaPackage(int age) {
        this.setAge(age);
    }

    public JavaPackage(String name, int age) {
        this.setName(name);
        this.setAge(age);
    }

     // 返回的是string所以要写string
     public String getName() {
         return name;
     }
     // 这里没有返回值所以为void(空) this为了解决和参数变量冲突
     public void setName(String name) {
         this.name = name;
     }

     public int getAge() {
         return age;
     }

     public void setAge(int age) {
         // 判断age合法性
         if (age < 0) {
             this.age = 0;
         }
         this.age = age;
     }

    public static void main(String[] args) {
        JavaPackage javaPackage = new JavaPackage();
        javaPackage.setAge(19);
        javaPackage.setName("乔布死");
        System.out.println(javaPackage.getAge());
        System.out.println(javaPackage.getName());

        // 上面定义了三种构造方法 ，那么调的时候也有三种方法可调，我只用了两种
        JavaPackage javaPackage1 = new JavaPackage("123",19);
        System.out.println(javaPackage1.getName());
        System.out.println(javaPackage1.getAge());
    }
}
